# coding=utf-8


def anyinparamsfuncs(p1, *args, **kwargs):
    """
        接受任意数量的位置参数， *参数名 --列表形式
        接受任意数量的关键字参数， **参数名 --字典形式
    :param p1:
    :param args: 一个*参数只能出现在函数定义中最后一个位置参数后面, 在*参数后面仍然可以定义其他参数
    :param kwargs: 而 **参数只能出现在最后一个参数
    :return:
    """
    print p1, args, kwargs  # pn,


# print anyinparamsfuncs.__annotations__


# def strictkwparam(p1, *p2, block=None):
#     print p1, p2, block
#
#
# strictkwparam(1,2,block=True)

# def minimum(*values, clip=None):
#     m = min(values)
#     if clip is not None:
#         m = clip if clip > m else m
#     return m

# def paraminfo(a: int, b: list) -> int:
#     print a, b

'''
    自由变量，在运行时绑定；定义时无关。
'''
x = 10
a = lambda y: x + y
x = 20
b = lambda y: x + y
print a(10)
print b(10)

'''
    定义时绑定值
'''
x = 1
a = lambda y, x=x: x + y
x = 2
b = lambda y, x=x: x + y
print a(1), b(1)

'''
    functools.partial() 封装函数入参
'''


def multiparams(a, b, c):
    print a, b, c


import functools

x = functools.partial(multiparams, 1)
x(2, 3)
